package persistencia.dao;

import java.util.List;

import org.hibernate.Query;
import persistencia.hbt.HibernateUtil;
import bean.EntidadPersistente;
import bean.ItemOrdenCompra;
import bean.OrdenCompra;
import bean.Producto;
import bean.Proveedor;

@SuppressWarnings("unchecked")
public class OrdenCompraDAO extends EntidadPersistenteDAO{
	private static OrdenCompraDAO instancia = null;
	
	public static OrdenCompraDAO getInstancia(){
		if(instancia == null)
			instancia = new OrdenCompraDAO();
		
		if (session == null)
			session = HibernateUtil.getSession();
		
		return instancia;
	}
	
	public Integer obtenerMayorNumeroDeOrdenParaProveedor(Proveedor proveedor)
	{
		Query query = session.createQuery(" select max(oc.numeroOrdenCompra) from OrdenCompra oc where oc.proveedor = :prov");
		query.setEntity("prov", proveedor);
		Integer mayorNumero = (Integer) query.setFirstResult(0).setMaxResults(1).uniqueResult();

		return (mayorNumero == null? 0: mayorNumero);
	}
	
	public List<ItemOrdenCompra> obtenerItemsOrdenDeCompraNoCumplidosParaProductoRecibido(Proveedor proveedor, Producto productoRecibido) {
		
		String q = "select ioc from OrdenCompra oc, ItemOrdenCompra ioc " +
				" where oc = ioc.ordenCompra  " +
				" and oc.proveedor = :proveedor and ioc.producto = :producto " +
				" and ioc.cantidadPedida > (select coalesce(sum(pr.cantidadRecibida),0) from ProductoRecibido pr where pr.itemOrdenCompra = ioc) " +
				" order by oc.fechaEmision asc " ;
		
		Query query = session.createQuery(q);
		query.setEntity("proveedor", proveedor);
		query.setEntity("producto", productoRecibido);
		
		return query.list();
	}
	
	public OrdenCompra buscar(EntidadPersistente entidad)
	{
		OrdenCompra orden = (OrdenCompra) entidad;
		
		if (orden.getId() != null)
			return (OrdenCompra) super.buscar(orden);
		else if (orden.getNumeroOrdenCompra() != null && orden.getProveedor() != null)
			return this.buscar(orden.getNumeroOrdenCompra(), orden.getProveedor());
		
		return null;
	}
	
	private OrdenCompra buscar(Integer nroOrdenCompra, Proveedor proveedor){
		Query query = session.createQuery(" from OrdenCompra oc where oc.numeroOrdenCompra = :num and oc.proveedor = :prov");
		query.setInteger("num", nroOrdenCompra);
		query.setEntity("prov", proveedor);
		OrdenCompra ordenCompra = (OrdenCompra) query.setFirstResult(0).setMaxResults(1).uniqueResult();

		return ordenCompra;
	}

}
